Pinvon's Blog

所见, 所闻, 所思, 所想

argparse

基本用法

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

输出:

$ python3 prog.py


$ python3 prog.py --help
usage: prog.py [-h]

optional arguments:
  -h, --help  show this help message and exit


$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose


$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo

基本用法

必选参数

必选参数的意思就是不用输入类似 "-v xxx" 的语句就可以获取到参数.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)

输出:

$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python3 prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit


$ python3 prog.py foo
foo

可选参数

可选参数有两种:

  1. 短参数, 形如: "-v xxx"
  2. 长参数, 形如: "--verbosity xxx"
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")

输出:

$ python3 prog.py --verbosity 1
verbosity turned on


$ python3 prog.py -v 1
verbosity turned on


$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument

可选的意思是你可以不填 -v 选项, 但是如果写了 -v, 对应的值一定要给.

禁止指定参数值

通过 action="store_true" 来禁止指定参数值.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

输出:

$ python3 prog.py --verbose
verbosity turned on


$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1

此时, 有写 --verbose 表示值为 True, 不写 --verbose 表示值为 False.

指定类型

arser = argparse.ArgumentParser()
parser.add_argument('x', type=int, help="the base")
args = parser.parse_args()
answer = args.x ** 2
print(answer)

选择某个值

parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)

使用 choices 表示只能在这里选择值, 输入其他值会出错.

自定义帮助信息

使用 help 参数.

parser.add_argument("square", type=int, help="display a square of a given number")

自定义程序帮助信息

在 ArgumentParser 中使用 description 参数.

argparse.ArgumentParser(description="calculate X to the power of Y")

互斥参数

group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")

互斥参数表示: -v -q 不可同时出现.

参数默认值

parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], default=1,
                    help="increase output verbosity")

使用 default 来指定默认值.

进阶

子命令

在学习 docker 命令时, 发现 docker 有子命令, 如 docker create, docker run 等. argparse 可以通过 add_subparsers 和 add_parser 来达到这种效果. 具体步骤为:

  • 在顶层解析器 parser 下, 定义 subparsers, 用来产生子命令解析器, 每个解析器只能有一个 subparsers;
  • 在 subparsers 下, 定义子解析器 parser_a, parser_b, 等等, 这是一对多的关系, 但这些子解析器是互斥关系.

如:

parser = argparse.ArgumentParser()
parser.add_argument('-a', metavar='host', default=get_ip(),
                    help='Host address')
parser.add_argument('-p', default='9876', help='Port')
parser.add_argument('-f', dest="file",
                    help="read method parameters from json file")

subparsers = parser.add_subparsers(title='Namespaces', metavar='namespace method [arg=value]')
parser_a = subparsers.add_parser('a', help='a help')
parser_a.add_argument('bar', type=int, help='bar help')

parser.parse_args()

输出:

$ python3 cli.py --help
usage: cli.py [-h] [-a host] [-p P] [-f FILE] namespace method [arg=value] ...

optional arguments:
  -h, --help            show this help message and exit
  -a host               Host address
  -p P                  Port
  -f FILE               read method parameters from json file

Namespaces:
  namespace method [arg=value]
    a                   a help
usage: cli.py a [-h] bar

positional arguments:
  bar         bar help

optional arguments:
  -h, --help  show this help message and exit

Comments

使用 Disqus 评论
comments powered by Disqus